﻿using System;

namespace _12._符合数据类型___枚举
{
    class Program
    {
        /// <summary>
        /// 性别
        /// </summary>
        public enum sex  //sex 性别
        {
            //这里写每一个枚举项 ，必须是不重名的字符串， 默认从 0 开始
            Man = 5, //男人 ，可以自己定义枚举项的数值
            Woman = 8,//女人

            /// <summary>未知 </summary>
            Ohters = 200 //其他
        }

        static void Main(string[] args)
        {
            //枚举 : 枚 量词，一枚硬币，两枚硬币，三枚硬币，记数性质，是一种整型性质
            //举：列举 、举例 ，展示给别人看
            // 用于方便计数，整型性质给别人看到一种类型。
            // 好处：写一次就好下次直接用枚举名称 点 出来, 对相同类型的数据进行分组整理 ，记录了整型数值
            // 关键字： enum
            Console.WriteLine(sex.Ohters);
            Console.WriteLine(sex.Woman);
            Console.WriteLine((int)sex.Man); //转换成 枚举项 对应的 整型数值
            Console.WriteLine(Convert.ToInt32(sex.Man));

            #region 在实际中的使用：
            sex person = sex.Man;

            //  if (person==sex.Man)
            //if ((int)person < 200) //转为    Int 甚至可以做数值大小判定，用于指定区域
            //if (person.ToString() == "Man")

            if (Convert.ToString(person) == "Man")
            {
                Console.WriteLine($"是男人或者女人 {person}");
            }
            else
            {
                Console.WriteLine("不知道性别");
            }
            #endregion

            #region 由枚举带来的逻辑简化便利
            if (person == sex.Man)
            {

            }
            else if (person == sex.Ohters)
            {

            }
            else if (person == sex.Woman)
            {

            }

            switch (person) //sw + Tab + person + ↓ 键 
            {
                case sex.Man:
                    Console.WriteLine("是男人");
                    break;
                case sex.Woman:
                    break;
                case sex.Ohters:
                    break;
                default:
                    break;
            }
            #endregion

            #region 类型转换

            //枚举的类型转换：int 可以强转 枚举，string 不能强转
            Console.WriteLine("---------------- 类型转换 ---------");
            Console.WriteLine((sex)5);
            Console.WriteLine((sex)8);
            Console.WriteLine((sex)200);


            //Console.WriteLine((sex)"Man"); 
            // string 转 枚举要用到 Enum 类 的 Parse 方法，但是只能转 string ，转 int 还得看上面
            // Type 是记录 Class 信息的另一种载体，多用于反射相关 
            sex p2 = (sex)Enum.Parse(typeof(sex), "Man");
            if (p2 == sex.Man)
            {
                Console.WriteLine($"转换 {sex.Man} 成功");
            }

            Console.WriteLine("---------------- 类型转换 ---------");
            #endregion

            #region 判定是否已经定义了某个枚举项

            // 判定 int 是否在 枚举里面有定义
            var exist = Enum.IsDefined(typeof(sex), 8); //exist 存在 is 是否，反问，Defined 定义 isDefind 是否定义了
            Console.WriteLine(exist ? "存在" : "不存在");

            for (int i = 0; i < 201; i++)
            {
                var exit = Enum.IsDefined(typeof(sex), i);
                if (exit)
                {
                    var p3 = (sex)i;
                    Console.WriteLine($"存在定义：{i} - { p3}");
                }
            }

            // 判定 string 是否在枚举中有定义
            exist = Enum.IsDefined(typeof(sex), "Man"); //exist 存在 is 是否，反问，Defined 定义 isDefind 是否定义了
            Console.WriteLine(exist ? "存在" : "不存在");

            var arr = new string[5] { "AAA", "Man", "Ohters", "Woman0", "Woman" };


            for (int i = 0; i < arr.Length; i++)
            {
                var exit = Enum.IsDefined(typeof(sex), arr[i]);
                if (exit)
                {
                    var p3 = Enum.Parse(typeof(sex), arr[i]);
                    Console.WriteLine($"存在定义：{i} - { p3}");
                }
            }



            #endregion

        }
    }
}
